iT邦幫忙

2023 iThome 鐵人賽

DAY 30
0
Software Development

Python十翼:與未來的自己對話系列 第 30

[Day30] specialist與Python3.12 f-strings in the grammar

  • 分享至 

  • xImage
  •  

今天我們推薦一個名為specialist的library,並試著了解Python3.12的f-strings in the grammar。有關於Python3.12的更新可以參考What’s New In Python 3.12或是Real Python的摘要。這次更新最令我們開心的小功能是,pathlib終於有了path.walk,省去了當要列出所有資料夾及檔案時,需要呼叫os.walk的窘境。

specialist

Python3.11相比於3.10,執行速度提高不少,有很大原因是因為微軟的Fast CPython Team,做了許多最佳化。詳細的內容可以參考PEP 659 – Specializing Adaptive InterpreterTalkPython
381集-Python Perf: Specializing, Adaptive Interpreter388集-Python 3.11 is here and it's fast

我們特別推薦大家看看specialist這個由Fast CPython Team的成員Brandt Bucher所維護的library。specialist會用不同顏色,來標注程式中還有機會可以提升速度的地方。

說明文件中舉了一個淺顯易懂的攝式與華式溫度轉換的例子,下面是我們一般會寫出的程式。
original_code

下面是經過specialist建議所修改的程式。只需要將int改為float(32->32.0)及將5/99/5加上括號,即可以提升速度。
specialized_code

我們建議大家可以按照自己習慣的方式來寫code,等到大部份的邏輯寫好後,再使用specialist來幫忙看看有沒有可以改進的地方。

如果想快速了解Python3.11~Python3.12速度提升的關鍵,可以觀看Brandt BucherPyCon US 2023的演講,裡面也有稍微提到specialist

f-strings in the grammar

PEP-701 Syntactic formalization of f-strings中,說明了這個變更,將可以大幅降低維護的難度,並讓f-stringsparser符合official Python grammar。比較有趣的是PEP-7012022-11-15提出,馬上就被接受並導入在Python3.12中,這開發速度著實有點驚人。因為Python3.12除了繼續使用各種策略進行速度提升外,也花費不少精力在放寬Gil的限制

Quote reuse

在Python3.11以前,四種表示str型態的符號,包括'"'''"""在同一個f-string中只能使用一次,不能nested,所以最極限的f-string寫法會像是:

#python3.11
>>> f"""{f'''{f'{f"{1+1}"}'}'''}"""
2

但在Python3.12,我們可以:

#python3.12
>>> f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}"
'2'

另外,這個變動讓我們可以在f-string中,重複使用同一種str型態的符號。

>>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']
#python3.11
>>> f"This is the playlist: {', '.join(songs)}"
'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'

#python3.12
>>> f"This is the playlist: {", ".join(songs)}"
'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'

Multi-line expressions and comments

可以使用Multi-line expression及加入comment

#python3.12
>>> f"This is the playlist: {", ".join([
...     'Take me back to Eden',  # My, my, those eyes like fire
...     'Alkaline',              # Not acid nor alkaline
...     'Ascensionism'           # Take to the broken skies at last
... ])}"
'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'

Backslashes and unicode characters

可以使用Backslash。所以可以在f-string內直接使用像'\n''\t'等符號來連接str。此外,也會連帶影響unicode escape sequence

#python3.12
>>> print(f"This is the playlist: {"\n".join(songs)}")
This is the playlist: Take me back to Eden
Alkaline
Ascensionism

>>> print(f"This is the playlist: {"\N{BLACK HEART SUIT}".join(songs)}")
This is the playlist: Take me back to Eden♥Alkaline♥Ascensionism

個人想法

自從f-string於Python3.6導入之後,一直都是它的愛用者。此次的變更,個人覺得不太習慣,感覺很不pythonic,可能得花些時間才能適應。因為綜合這三個特點來看,「好像」是在鼓勵我們於f-string中進行較冗長或是nested的操作,且因為quote可以重覆使用,在沒有IDE顏色的提示下,我很懷疑自己是否能看得懂程式碼。但是從pep-701的討論中,可以看出開發者認為利遠大於弊,或許身為Python使用者的我們,得順應發展做出改變才是。

感謝時間

非常開心又完成一次充實的鐵人挑戰賽,請容我們用些許篇幅,感謝幫助我們完賽的兩位功臣。

  1. 很少人的人生可以一帆風順,大部份的情況是在順境與逆境中不斷切換。如何在順境中感恩惜福,並在逆境中努力不餒,是我們一生的課題。傅佩榮教授對於易經內容的傳授,幫助我對人生有了更深的體悟。建議有興趣進入易經世界的朋友,可以參考傅教授的YouTube傅佩榮國學官方頻道傅佩榮解讀易經(於YouTube內有相關購書連結)。
  2. 第二位是超級好用的Markdown線上編輯平台HackMD。本系列文的所有編輯皆是在HackMD上完成,於發文前再直接貼過來,由衷感謝他們開發了這個好用的平台。

Python交流

如果有同好想交流Python的原理或知識,可以透過LinkedInE-mail 聯絡我。


上一篇
[Day29] 末翼 - Term Projects:Project Postman - 研究如何傳遞decorator factory之參數
系列文
Python十翼:與未來的自己對話30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言